Check that the mask is NULL or a string of the same length consisting
authorMatthias Clasen <maclas@gmx.de>
Fri, 14 Nov 2003 23:28:01 +0000 (23:28 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 14 Nov 2003 23:28:01 +0000 (23:28 +0000)
Sat Nov 15 00:26:19 2003  Matthias Clasen  <maclas@gmx.de>

* queryloaders.c (loader_sanity_check): Check that the mask
is NULL or a string of the same length consisting entirely of
' ', '!', 'x', 'z', 'n'.

docs/reference/ChangeLog
docs/reference/gdk-pixbuf/tmpl/module_interface.sgml
gdk-pixbuf/ChangeLog
gdk-pixbuf/queryloaders.c

index 95fa449a0e785c97907c6a7185919399d1a8a6d1..f9e1a31d26eae64b2826beddedca832e6bacbb7d 100644 (file)
@@ -1,3 +1,8 @@
+Sat Nov 15 00:25:39 2003  Matthias Clasen  <maclas@gmx.de>
+
+       * gdk-pixbuf/tmpl/module_interface.sgml: Add an example
+       for GdkPixbufModulePattern.
+
 Wed Nov 12 21:52:35 2003  Matthias Clasen  <maclas@gmx.de>
 
        * gtk/gtk-sections.txt: Add gtk_menu_set_monitor.
index 9bacd0e492794e96cadf41be6339d654b988ff13..c3c86af9696cd30a053982873f833c4b8b9a216b 100644 (file)
@@ -18,8 +18,8 @@ a #GdkPixbufModuleFillVtableFunc function named
 In order to make format-checking work before actually loading the modules
 (which may require dlopening image libraries), modules export their 
 signatures (and other information) via the <function>fill_info</function>
-function. An external utility, <command>gdk-pixbuf-query-loaders</command>, uses
-this to create a text file containing a list of all available loaders and 
+function. An external utility, <command>gdk-pixbuf-query-loaders</command>, 
+uses this to create a text file containing a list of all available loaders and 
 their signatures. This file is then read at runtime by &gdk-pixbuf; to obtain
 the list of available loaders and their signatures. 
 </para>
@@ -158,18 +158,30 @@ operations.
 <!-- ##### STRUCT GdkPixbufModulePattern ##### -->
 <para>
 The signature of a module is a set of prefixes. Prefixes are encoded as
-pairs of ordinary strings, where the second string, if not %NULL,
-may contain ' ', '!', 'x', 'z', and 'n' to indicate bytes that must be 
-matched, not matched, "don't-care"-bytes, zeros and non-zeros.
+pairs of ordinary strings, where the second string, if not %NULL, must be
+of the same length as the first one and may contain ' ', '!', 'x', 'z', 
+and 'n' to indicate bytes that must be matched, not matched, 
+"don't-care"-bytes, zeros and non-zeros.
 Each prefix has an associated integer that describes the relevance of 
 the prefix, with 0 meaning a mismatch and 100 a "perfect match".
 </para>
 
 <para>
 The signature of a module is stored as an array of 
-#GdkPixbufModulePattern<!-- -->s. 
+#GdkPixbufModulePattern<!-- -->s. The array is terminated by a pattern
+where the @prefix is %NULL.
 </para>
 
+<informalexample><programlisting>
+GdkPixbufModulePattern *signature[] = {
+  { "abcdx", " !x z", 100 },
+  { "bla", NULL,  90 },
+  { NULL, NULL, 0 }
+};
+</programlisting>
+The example matches e.g. "auud\0" with relevance 100, and "blau" with 
+relevance 90.</informalexample>
+
 @prefix: the prefix for this pattern
 @mask: mask containing bytes which modify how the prefix is matched against
   test data
index be50ab86c044f06e808ab1c03b817d24320d62c3..e1286f7441ea22d64d126f4fa3c5142b2c909720 100644 (file)
@@ -1,3 +1,9 @@
+Sat Nov 15 00:26:19 2003  Matthias Clasen  <maclas@gmx.de>
+
+       * queryloaders.c (loader_sanity_check): Check that the mask
+       is NULL or a string of the same length consisting entirely of
+       ' ', '!', 'x', 'z', 'n'. 
+
 Mon Nov 10 00:17:52 2003  Matthias Clasen  <maclas@gmx.de>
 
        * Makefile.am (install-data-local): Typo fix in warning.
index 0e1502a443024126f32061ae41e2a645dcdb33d1..41c4c3669d144fa695cd89d7731b2566bf88489f 100644 (file)
@@ -59,13 +59,32 @@ loader_sanity_check (const char *path, GdkPixbufFormat *info, GdkPixbufModule *v
        const GdkPixbufModulePattern *pattern;
        const char *error = "";
 
-       for (pattern = info->signature; pattern->prefix; pattern++)
-               if (strlen (pattern->prefix) == 0) 
+       for (pattern = info->signature; pattern->prefix; pattern++) 
+       {
+               int prefix_len = strlen (pattern->prefix);
+               if (prefix_len == 0) 
                {
                        error = "empty pattern";
 
                        goto error;
                }
+               if (pattern->mask)
+               {
+                       int mask_len = strlen (pattern->mask);
+                       if (mask_len != prefix_len)
+                       {
+                               error = "mask length mismatch";
+                               
+                               goto error;
+                       }
+                       if (strspn (pattern->mask, " !xzn") < mask_len) 
+                       {
+                               error = "bad char in mask";
+                               
+                               goto error;
+                       }
+               }
+       }
 
        if (!vtable->load && !vtable->begin_load && !vtable->load_animation)
        {